# 作业：
# 1、整理类的笔记到小红书
# 2、定义一个学生Student类。有下面的类属性：
# 1 姓名 name
# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]

# 类方法：
# 1 获取学生的姓名：get_name() 返回类型:str
# 2 获取学生的年龄：get_age() 返回类型:int
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
# 4 将每个实例学生对象写进txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
# 写好类以后，可以定义2个同学测试下:
# zm = Student('zhangming',20,[69,88,100])
# 返回结果：
# zhangming
# 20
#
class Student():
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

    def get_course(self):
        return max(self.score)

    def set_txt(self):
        import os
        dict1 = {}
        dict1['姓名'] = self.name
        dict1['年龄'] = self.age
        dict1['成绩'] = {'语文': self.score[0], '数学': self.score[1], '英语': self.score[2]}
        with open('./student.txt', "a", encoding='utf-8') as f:
            # dict1_JSON = json.dumps(dict1)
            f.write(str(dict1))
            f.write('\n')

    def look_txt(self):
        with open('./student.txt', "r", encoding='utf-8') as f:
            return f.read()


student1 = Student("Alice", 18, [90, 85, 92])
# print(student1.get_name())
# print(student1.get_age())
# print(student1.get_course())
# student1.set_txt()
student2 = Student('fengdingyu', 18, [80, 60, 70])


# print(student2.get_name())
# print(student2.get_age())
# print(student2.get_course())
# student2.set_txt()
# print(student2.look_txt())

# 3、定义一个字典类：dictclass。完成下面的功能：
# dict = dictclass({你需要操作的字典对象})
# 1 删除某个key
# del_dict(key)
# 2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
# get_dict(key)
# 3 返回键组成的列表：返回类型;(list)
# get_key()
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
# update_dict({要合并的字典})
# 100
class Dictclass():
    def __init__(self, dict1):
        self.dict1 = dict1

    def del_dict(self, key):
        del self.dict1[key]
        return self.dict1

    def get_dict(self, key):
        if key in self.dict1.keys():
            return self.dict1[key]
        else:
            return 'not found'

    def get_key(self):
        list_ = self.dict1.keys()
        list_ = list(list_)
        print(type(list_))
        return list_

    def update_dict(self, dict2):
        self.dict1.update(dict2)
        return self.dict1


new_dict = Dictclass({'姓名': '冯定宇', '年龄': '25'})


# print(new_dict.del_dict('姓名'))
# print(new_dict.get_dict('年龄'))
# print(new_dict.get_key())
# print(new_dict.update_dict({'地址': '沈阳'}))
# print(new_dict.update_dict({'性别': '男'}))


# 4、定义一个列表的操作类：Listinfo
# 包括的方法:
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]
# 4 删除并且返回最后一个元素：del_key()
# a = Listinfo([44,222,111,333,454,'sss','333'])
class Listinfo():
    def __init__(self, list1):
        self.list1 = list1

    def add_key(self, keyname):
        self.list1.append(keyname)
        return self.list1

    def get_key(self, num):
        for i in range(len(self.list1)):
            if i == num:
                return self.list1[i]

    def update_list(self, list2):
        self.list1.extend(list2)
        return self.list1

    def del_key(self):
        del self.list1[-1]
        return self.list1


a = Listinfo([44, 222, 111, 333, 454, 'sss', '333'])


# print(a.add_key('dada'))
# print(a.get_key(2))
# print(a.update_list([1, 2, 3, 4, 5]))
# print(a.del_key())
# 5、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！

# student表：name、age、address、phone_number

class StudentCallTheRoll():
    def __init__(self, list1):
        self.list1 = list1

    def inTheStudent(self, student):
        self.list1.append(student)
        return '存入成功'

    def changeTheStudents(self, name, new_info):
        for i in self.list1:
            if i['name'] == name:
                i.update(new_info)
                return '修改成功'
            return '未找到学生'

    def delStudent(self, name):
        for i in self.list1:
            if i['name'] == name:
                self.list1.remove(i)
                return '删除成功'
            '删除失败'

    def lookStudent(self):
        return self.list1

    def sunji(self):
        list_name = []
        import random
        for i in self.list1:
            list_name.append(i['name'])
        xx = random.choice(list_name)
        print(f'{xx}到！')


student = StudentCallTheRoll([])


# print(student.inTheStudent({'name': '小红', 'age': 99, 'address': '老刘废品收购站', 'phone_number': '110'}))
# print(student.inTheStudent({'name': '小绿', 'age': 99, 'address': '老刘废品收购站', 'phone_number': '110'}))
# print(student.inTheStudent({'name': '小王', 'age': 99, 'address': '老刘废品收购站', 'phone_number': '110'}))
# print(student.inTheStudent({'name': '小张', 'age': 99, 'address': '老刘废品收购站', 'phone_number': '110'}))
# print(student.inTheStudent({'name': '小黄', 'age': 99, 'address': '老刘废品收购站', 'phone_number': '110'}))
# print(student.inTheStudent({'name': '刘闯', 'age': 99, 'address': '老刘废品收购站', 'phone_number': '110'}))
# print(student.inTheStudent({'name': '张3', 'age': 99, 'address': '老刘废品收购站', 'phone_number': '110'}))
# print(student.changeTheStudents('刘闯', {'address': '来测'}))
# print(student.delStudent('张3'))
# print(student.lookStudent())
# student.sunji()

# 6、点餐管理系统
# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；

class Food:
    def __init__(self, name, price):
        self.name = name
        self.price = price
        self.kucun = 999
        self.like = []


class Restaurant:
    def __init__(self):
        self.food = []

    def add_food(self, food):
        self.food.append(food)
        print('菜品添加成功')

    def shop_food(self, name):
        for i in self.food:
            if i.name == name:
                i.kucun -= 1
                print(f'卖出去了一道库存变成{i.kucun}')

    def del_food(self, name):
        for f in self.food:
            if f.name == name:
                self.food.remove(f)
                print('菜品删除成功')
                return
        print('菜品不存在')

    def update_food(self, name, new_price):
        for f in self.food:
            if f.name == name:
                f.price = new_price
                print('菜品价格更新成功')
                return
        print('菜品不存在')

    def look_food(self):
        print('菜单：')
        for f in self.food:
            print(f.name, f.price, f.kucun, f.like)

    def dafen(self, name, num):
        for i in self.food:
            if i.name == name:
                i.like.append(num)
                print('打分成功')

    def reportFunction(self):
        for i in self.food:
            if sum(i.like) / len(i.like) < 3:
                self.del_food(i.name)


# restaurant = Restaurant()
#
# # 添加菜品
# food1 = Food("宫保鸡丁", 12)
# food2 = Food("鱼香肉丝", 10)
# food3 = Food("红烧肉", 15)
# restaurant.add_food(food1)
# restaurant.add_food(food2)
# restaurant.add_food(food3)
# restaurant.shop_food('宫保鸡丁')
# restaurant.shop_food('宫保鸡丁')
# restaurant.shop_food('红烧肉')
# restaurant.shop_food('鱼香肉丝')
# restaurant.update_food("鱼香肉丝", 18)
# ### 打分
# restaurant.dafen('鱼香肉丝', 5)
# restaurant.dafen('鱼香肉丝', 3)
# restaurant.dafen('鱼香肉丝', 2)
#
# restaurant.dafen('红烧肉', 4)
# restaurant.dafen('红烧肉', 3)
# restaurant.dafen('红烧肉', 1)
#
# restaurant.dafen('宫保鸡丁', 2)
# restaurant.dafen('宫保鸡丁', 3)
# restaurant.dafen('宫保鸡丁', 2)
#
# restaurant.look_food()
#
# # 评分小于三分 下架
# restaurant.reportFunction()
# restaurant.look_food()


# 7、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，并调用showInfo方法，输出每个桌子的信息。
class Desk():
    def __init__(self, name, length, width, height):
        self.name = name
        self.length = length
        self.width = width
        self.height = height


class infomation():
    def __init__(self):
        self.xinxi = []

    def add_(self, zuozi):
        self.xinxi.append(zuozi)
        return '添加成功'

    def look_(self):
        for i in self.xinxi:
            print(i.name, i.length, i.width, i.height)


desk = Desk('桌子1', 20, 20, 10)
desk1 = Desk('桌子2', 15, 15, 5)


# infomation1 = infomation()
# infomation1.add_(desk)
# infomation1.add_(desk1)
# infomation1.look_()


# 8、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
# class User():
#     def __init__(self,username,password):
#         self.username = username
#         self.password = password

# 9、定义一个计算器类，有加减乘除四个方法
class theCalculator():
    def jia(self, a, b):
        return a + b

    def jian(self, a, b):
        return a - b

    def cheng(self, a, b):
        return a * b

    def chu(self, a, b):
        return a / b


suan = theCalculator()


# print(suan.jia(5, 4))
# print(suan.jian(5, 4))
# print(suan.cheng(5, 4))
# print(suan.chu(5, 4))
# 10、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
# class Person():
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#     def greet(self):
#         print(f'我是{self.name},今年{self.age}')
#
# persom = Person('冯定宇',25)
#
# persom.greet()

# 11、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果

class Shuxing():
    def __init__(self, name, zuozhe, date):
        self.name = name
        self.zuozhe = zuozhe
        self.date = date


class Tushu():
    def __init__(self):
        self.dict1 = []

    def add_book(self, book):
        self.dict1.append(book)

    def update_book(self, name, zuozhe, date):
        for i in self.dict1:
            if i.name == name:
                i.zuozhe = zuozhe
                i.date = date

    def del_book(self, name):
        for i in self.dict1:
            if i.name == name:
                self.dict1.remove(i)
                print('删除成功！')

    def look_book(self, name):
        for i in self.dict1:
            if i.name == name:
                print(i.name, i.zuozhe, i.date)

    def zhanshi(self):
        for i in self.dict1:
            print(i.name, i.zuozhe, i.date)


# gan = Tushu()
#
# shuxing1 = Shuxing('一', '不知道', '8.25')
# shuxing2 = Shuxing('二', 'dada', '8.25')
# shuxing3 = Shuxing('三', 'dada', '8.25')
# shuxing4 = Shuxing('四', 'dada', '8.25')
# shuxing5 = Shuxing('五', 'dada', '8.25')
# shuxing6 = Shuxing('六', 'dada', '8.25')
# gan.add_book(shuxing1)
# gan.add_book(shuxing2)
# gan.add_book(shuxing3)
# gan.add_book(shuxing4)
# gan.add_book(shuxing5)
# gan.add_book(shuxing6)
# gan.update_book('二','冯定宇','20')
# gan.del_book('一')
# gan.look_book('四')
# # gan.zhanshi()


# 12、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color

    def start_engine(self):
        print("启动汽车引擎！")

    def stop_engine(self):
        print("关闭汽车引擎！")


# my_car = Car("BMW", "红色")
# print(my_car.brand)
# print(my_car.color)
#
# my_car.start_engine()
# my_car.stop_engine()


# 13、淘宝商家后台，可以上架商品、下架商品，功能如下：
#  （1） 可以添加商品，商家添加完的商品会存到商品列表
#  1.1  商品要有名称、sku、价格
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品进行下架，下架后的商品不再展示
class Taobao():
    def __init__(self):
        self.shop = []

    def add_shop(self, shop):
        self.shop.append(shop)
        print('添加成功')
        print(self.shop)

    def update_shop(self, index, new_info):
        for i in range(len(self.shop)):
            if self.shop[i]['名称'] == new_info['名称']:
                self.shop[i].update(new_info)
                print('商品信息已更新')
                print(self.shop)
                return
        print('找不到要更新的商品')

    def del_shop(self, name):
        for i in self.shop:
            if i['名称'] == name:
                self.shop.remove(i)
                print('删除成功')
                print(self.shop)


# newtaobao = Taobao()
# newtaobao.add_shop({'名称': '小米手机', 'sku': '这是什么东西', '价格': '5000'})
# newtaobao.add_shop({'名称': '苹果手机', 'sku': '这是什么东西', '价格': '6000'})
# new_info = {'名称': '小米手机', 'sku': '这是新款手机', '价格': '5500'}
# newtaobao.update_shop('小米手机', new_info)
# newtaobao.del_shop('苹果手机')


# 14、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤
class Person():
    def __init__(self, xiaomi=75, xiaome=45):
        self.xiaomi = xiaomi
        self.xiaome = xiaome

    def run(self, name):
        if name == '小明':
            self.xiaomi -= 0.5
            print(f'小明跑步 减少了{0.5}公斤')
            print(self.xiaomi)
        elif name == '小美':
            self.xiaome -= 0.5
            print(f'小美跑步 减少了{0.5}公斤')
            print(self.xiaome)

    def eat(self, name):
        if name == '小明':
            self.xiaomi += 1
            print(f'小明吃饭 增加了1公斤')
            print(self.xiaomi)
        elif name == '小美':
            self.xiaome += 1
            print(f'小美吃饭 增加了1公斤')
            print(self.xiaome)


# person = Person()
# person.run('小明')
# person.run('小美')
# person.eat('小美')
# person.eat('小明')
# person.eat('小美')
# person.eat('小明')
# person.eat('小美')
# person.eat('小明')

# 15、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是扳机）
# 抢能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
# 要求没子弹，需要输出没有子弹了，且发射失败
class ak47():
    def __init__(self, rongliang=30, danjia=90):
        self.rongliang = rongliang
        self.danjia = danjia

    def fire(self):
        if self.rongliang:
            self.rongliang -= 1
            print(f'哒哒哒！！！弹夹容量还有{self.rongliang}')
        else:
            print('没子弹了自动换弹夹')
            return self.inACartridge()

    def inACartridge(self):
        if self.danjia:
            self.danjia -= 30
            self.rongliang += 30
            print('换弹夹')
        else:
            print('快跑')

# daqiang = ak47()
# for i in range(124):
#     daqiang.fire()
